package com.java.jvm.bytecode;

import com.java.jvm.bytecode.service.ResourceService;
import javassist.*;

import java.io.IOException;

/**
 * 基于此类为com.java.jvm.bytecode.service.ResourceService的handle方法做功能增强
 * 思考：
 * 1)对目标类中的方法要进行功能增强的一个基本步骤是怎样的？
 * 1.1)如何获取目标类(基于ClassPool获取)
 * 1.2)如何获取目标方法(基于CtClass获取)
 * 1.3)如何为方法进行功能增强(基于CtMethod实现)
 */
public class JavassistTests {
    public static void main(String[] args) throws NotFoundException, CannotCompileException, IllegalAccessException, InstantiationException, IOException {
        ResourceService rsss=new ResourceService();
        //1.获取目标类(目标类的信息会封装到CtClass对象中)
        CtClass ctClass = ClassPool.getDefault()
                .get("com.java.jvm.bytecode.service.ResourceService");
        //2.获取目标方法信息
        CtMethod targetMethod = ctClass.getDeclaredMethod("handle");
        //3.执行方法功能增强
        targetMethod.insertBefore("{System.out.println(\"start\");}");
        targetMethod.insertAfter("{System.out.println(\"end\");}");
        //4.创建新的字节码对象
        Class<?> aClass = ctClass.toClass();
        ResourceService rs=(ResourceService) aClass.newInstance();
        rs.handle();
        //5.将这个新的字节码存储到磁盘指定位置(可选)
        ctClass.writeFile("01-java/target/classes/");
    }
}
